/*
 * Copyright (C) 2006 Sun Microsystems, Inc. All rights reserved. 
 * Copyright (C) 2009 John Pritchard and the Jela Project. All rights reserved. 
 * Use is subject to license terms.
 *
 * Redistribution and use in source and binary forms, with or without modification, are 
 * permitted provided that the following conditions are met: Redistributions of source code 
 * must retain the above copyright notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list of 
 * conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution. Neither the name of the Sun Microsystems nor the names of 
 * is contributors may be used to endorse or promote products derived from this software 
 * without specific prior written permission. 

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package jela;

import java.util.Map;

/**
 * ClassLoader that loads class files from memory.
 * 
 * @author A. Sundararajan
 * @author J. Pritchard
 */
public final class JelaClassLoader
    extends ClassLoader
{
    public final static JelaClassLoader Instance(){
        try {
            Thread T = Thread.currentThread();
            ClassLoader cl = T.getContextClassLoader();
            if (cl instanceof JelaClassLoader)
                return (JelaClassLoader)cl;
            else {
                JelaClassLoader jcl = new JelaClassLoader(cl);
                T.setContextClassLoader(jcl);
                return jcl;
            }
        }
        catch (Exception security){

            return new JelaClassLoader(JelaClassLoader.class.getClassLoader());
        }
    }


    public JelaClassLoader(ClassLoader parent){
        super(parent);
    }


    public Class classFor(JelaProgramCompiler compiled){
        byte[] classfile = compiled.getClassFile();
        String classname = compiled.getClassName();
        if (null != classname && null != classfile){
            try {
                return this.defineClass(classname,classfile,0,classfile.length);
            }
            catch (ClassFormatError err){
                return null;
            }
        }
        else
            return null;
    }
}
